/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package proycomplejidadopt;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
import javax.swing.border.TitledBorder;



public class GUI extends JFrame implements ActionListener{
    
        //private JFrame ventana;
	private JPanel panelSup, panelIzq, panelDer;
        private GridLayout grilla;
	private JMenuBar barraMenu, barMenuEsp;
	private JMenu menuAcc, menuAyuda;
        private JButton abrir2, ejecutar2;
	private JMenuItem abrir, ejecutar, limpiar, acerca,cerrar;
	private JSeparator separar;
	private JTextArea resultados;
	private TitledBorder bordePanIzq, bordePanDer;
        private JFileChooser elegArch;
        private File entrada;
        private JLabel etiqueta;
        private ImageIcon abr, ejec, resp;
        private Controlador control;
        private boolean cargoDatos;
        private Timer timer;
        private String archRespuesta=null;
        private int cantEjecuciones;
	public GUI()
	{
		//ventana= new JFrame("Optimizacion-Ubicacion Bodega");
                cantEjecuciones=0;
                grilla=new GridLayout(2,0);
		panelDer=new JPanel();
		panelIzq=new JPanel();
		panelSup=new JPanel(grilla);
		barraMenu=new JMenuBar();
		barMenuEsp=new JMenuBar();
		menuAcc=new JMenu("Acciones");
		menuAyuda=new JMenu("?");
		abrir=new JMenuItem("Abrir");
		ejecutar=new JMenuItem("Ejecutar");
		limpiar=new JMenuItem("Limpiar");
		acerca=new JMenuItem("Acerca de");
		cerrar=new JMenuItem("Cerrar");
		separar=new JSeparator();
		bordePanDer=new TitledBorder("Resultado");
		bordePanIzq=new TitledBorder("Informacion Problema");
                elegArch= new JFileChooser();
                elegArch.setCurrentDirectory(new File("."));
		resultados=new JTextArea(31,20);
                etiqueta=new JLabel("");
                cargarImagenes();
                abrir2=new JButton(abr);
                abrir2.setToolTipText("Abrir");
                ejecutar2=new JButton(ejec);
                ejecutar2.setToolTipText("Ejecutar");
                control=new Controlador();
		cargoDatos=false;
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		organizarComponentes();
                limpiar();
                
                timer=new Timer(1000, this);
		//this.pack();
		//ventana.setVisible(true);
	}
        private void limpiar()
        {
            resultados.setText("");
            etiqueta.setIcon(null);
            control=new Controlador();
            ejecutar.setEnabled(false);
            ejecutar2.setEnabled(false);
            cargoDatos=false;
        }
	private void organizarComponentes()
	{
                this.setTitle("Optimizacion-Eleccion Bodega");
		this.setSize(900,650);
                //this.setResizable(true);
                etiqueta.setBounds(1,1,200,200);
                abrir.addActionListener(this);
                abrir2.addActionListener(this);
                ejecutar.addActionListener(this);
                ejecutar2.addActionListener(this);
                limpiar.addActionListener(this);
                cerrar.addActionListener(this);
		menuAcc.add(abrir);
		menuAcc.add(ejecutar);
		menuAcc.add(limpiar);
		menuAcc.add(separar);
		menuAcc.add(cerrar);
		menuAyuda.add(acerca);
		barraMenu.add(menuAcc);
		barraMenu.add(menuAyuda);
                barMenuEsp.add(abrir2);
                barMenuEsp.add(ejecutar2);
		panelSup.add(barraMenu);
                panelSup.add(barMenuEsp);
		panelIzq.setBorder(bordePanIzq);
                panelDer.setSize(new Dimension(200,200));
		panelDer.setBorder(bordePanDer);
                panelIzq.setSize(new Dimension(500,500));
                panelDer.add(etiqueta);
                resultados.setEditable(false);
		panelIzq.add(resultados);
                elegArch.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
		this.add(panelSup,BorderLayout.PAGE_START);
		this.add(panelIzq,BorderLayout.WEST);
		this.add(panelDer,BorderLayout.CENTER);	
	}
        
    private void cargarImagenes()
    {
        ClassLoader cldr = this.getClass().getClassLoader();
        java.net.URL imageURL1 = cldr.getResource("proycomplejidadopt/varios/add_page.png");
        java.net.URL imageURL2 = cldr.getResource("proycomplejidadopt/varios/next.png");
        abr = new ImageIcon(imageURL1);
        ejec=new ImageIcon(imageURL2);
    }
        

    @Override
    public void actionPerformed(ActionEvent ae) {
        //throw new UnsupportedOperationException("Not supported yet.");
        Object obj= ae.getSource();
        if (obj.equals(abrir)||obj.equals(abrir2))
        {
            int eleccion=elegArch.showOpenDialog(this);
            if(eleccion==JFileChooser.APPROVE_OPTION)
            {
                limpiar();
                entrada=elegArch.getSelectedFile();
                control.setNombreArchivo(entrada.getPath());
                cargoDatos=control.cargarDatos();
                ejecutar.setEnabled(cargoDatos);
                ejecutar2.setEnabled(cargoDatos);
                agregarInfoEntrada();
            }
        }
        
        if(obj.equals(ejecutar)||obj.equals(ejecutar2))
        {
            if(cargoDatos)
            {
                File f=new File("out"+cantEjecuciones+".gif");
                f.delete();
		int salida=control.obtenerSolucion();
                System.out.println("salida"+salida);
                if(salida==-5||salida>1)
                {
                    JOptionPane.showMessageDialog(null,  "La cantida producida es > (demanda+capacidadBodega) o La demanda es > Produccion", "Insatisfactible", JOptionPane.ERROR_MESSAGE);
                }
                else
                {
                    mostrarRespuesta();
                    cantEjecuciones++;
                }
            }
        }
	
	if(obj.equals(limpiar))
	{
		limpiar();
	}

	if(ae.getSource().equals(cerrar))
	{	
		System.exit(0);
	}
        if(obj.equals(timer))
        {
            timer.stop();
            resp = new ImageIcon(archRespuesta);
            etiqueta.setText("");
            etiqueta.setIcon(resp);
            resultados.append("\nCosto Total="+(int)control.getSolucionador().getValorFuncObjetivo());
            
        }
    }
    
    public void agregarInfoEntrada()
    {
        int numeroBodegas, numeroPS, numeroPD;
        try
        {
            BufferedReader bf=new BufferedReader(new FileReader(entrada));
            StringTokenizer st;
            String linea;
            linea=bf.readLine(); //se lee el numero de bodegas
            resultados.append("Numero de Bodegas: "+linea+"\n");
            linea=bf.readLine();
            resultados.append("Numero de PS: "+linea+"\n");
            linea=bf.readLine();
            resultados.append("Numero de PD: "+linea+"\n");
        }
        catch(IOException ex)
        {
            System.out.println("Error en la lectura del archivo");
        }  
    }
	
    public void mostrarRespuesta()
    {
	
	archRespuesta=control.generarGrafo(cantEjecuciones);
        System.out.println("Despues de generar grafo: "+archRespuesta);
	ClassLoader cldr = this.getClass().getClassLoader();
	java.net.URL imageURL   = cldr.getResource("proycomplejidadopt/varios/loading.gif");
	
	resp = new ImageIcon(imageURL);
	etiqueta.setText("");
        etiqueta.setIcon(resp);
        timer.start();
    }
	
}
